//
//  KCView.m
//  ContextTransform
//
//  Created by YannisChou on 16/3/27.
//  Copyright © 2016年 Alibaba. All rights reserved.
//
//  我们知道在UIKit开发中UIView有一个transform属性用于控件的形变，其实在绘图中我们也经常用到图形形变，
//  这个时候可以借助图形上下文的形变方法来完成。
//  在弄清形变之前我们要清楚图形上下文的坐标原点，因为无论是位移还是旋转都是相对于坐标原点进行的。
//  其实Quartz 2D的坐标系同UIKit并不一样，它的坐标原点在屏幕左下方，但是为了统一编程方式，UIKit对其进行了转换，坐标原点统一在屏幕左上角
//  注意在设置图形上下文形变之前一定要注意保存上下文的初始状态，在使用完之后进行恢复。否则在处理多个图形形变的时候很容易弄不清楚到底是基于
//  怎样的坐标系进行绘图，容易找不到原点（做过html5 canvas绘图的朋友对这一点应该很熟悉，在html5中绘图也经常进行状态保存和恢复）。

#import "KCView.h"

@implementation KCView

-(void)drawRect:(CGRect)rect{
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self drawImage:context];
}
-(void)drawImage:(CGContextRef)context{
    // 保存初始状态
    CGContextSaveGState(context);
    
    // 形变第一步，图形上下文右移40
    CGContextTranslateCTM(context, 100, 0);
    
    // 形变第二步，缩放0.8
    CGContextScaleCTM(context, 0.8, 0.8);
    
    // 形变第三步，旋转
    CGContextRotateCTM(context, M_PI_4 / 4);
    
    UIImage *image = [UIImage imageNamed:@"Image"];
    [image drawInRect:CGRectMake(0, 50, 240, 300)];
    
    // 恢复到初始状态
    CGContextRestoreGState(context);
}

#pragma mark Quartz 2D内置绘制
// 整个图像是倒过来的，原因正是前面说的：在Core Graphics中坐标系的y轴正方向是向上的，坐标原点在屏幕左下角，y轴方向刚好和UIKit中y轴方向相反
// 如何解决呢
// 其实图形上下文只要沿着x轴旋转180度，然后向上平移适当的高度即可（但是注意不要沿着z轴旋转，这样得不到想要的结果）。
// 可是通过前面介绍的CGContextRotateCTM方法只能通过沿着z轴旋转，此时不妨使用另外一种方法，那就是在y轴方向缩放-1，同样可以达到想要的效果
-(void)drawImage2:(CGContextRef)context{
    UIImage *image = [UIImage imageNamed:@"Image"];
    CGSize size = [[UIScreen mainScreen] bounds].size;
    CGContextSaveGState(context);
    CGFloat height = 450,y = 50;
    // 上下文形变
    CGContextScaleCTM(context, 1.0, -1.0); // 在y轴缩放-1相当于沿着x轴旋转180
    CGContextTranslateCTM(context,0, -(size.height - (size.height-2*y -height))); // 向上平移
    
    // 图像绘制
    CGRect rect = CGRectMake(10, y, 300, height);
    CGContextDrawImage(context, rect, image.CGImage);
    
    CGContextRestoreGState(context);
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

@end
